function add(a, b, c) {
    return a + b + c;
}
// 三个参数每次自能给一个
// add(1)(2)(3)
// let result = add(1, 2, 3)
// 函数的颗粒化
/**
 * @param {function} fn
 * @return function
 */
function curry(fn) {
    // 函数嵌套函数，内部函数会被返回到外部
    // 闭包空间中
    // fn 等于 let a = 1
    // 慢慢的收集拿到的参数
    // fn 等在闭包空间里的永生变量在被闭包函数申明时已经存在

    // let arr = []
    // 声明时 当调用addcurry时，
    let judge = (...args) => {
        if (args.length == fn.length) return fn(...args)
        return (...arg) => judge(...args, ...arg)
    }
    return judge
    // return (args) => {
    //     // 函数运行时可以访问到申明时的变量
    //     // fn
    //     arr.push(args)
    //     if (arr.length === 3) {
    //         fn(...arr)
    //     }
    // }
}
// console.log(add.length)
// 得到被闭包的函数
let addCurry = curry(add) // 返回值 函数
console.log( addCurry(1)([2,3])(3) )// 一次接收一个参数，... 直到接收到的参数等于add需要的参数数量， 就执行， 并返回结果